package com.rmfyzxfw.caseprocess.controller;

import com.rmfyzxfw.caseprocess.boot.result.page.Pagination;
import com.rmfyzxfw.caseprocess.model.cmd.*;
import com.rmfyzxfw.caseprocess.model.param.CaseProcessDataNodeDataParam;
import com.rmfyzxfw.caseprocess.model.param.ProcessListParam;
import com.rmfyzxfw.caseprocess.model.vo.*;
import com.rmfyzxfw.caseprocess.service.ProcessService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;


@RestController
@RequestMapping("api/v3/process")
@RequiredArgsConstructor
@Api(tags = "流程")
public class ProcessController {
    private final ProcessService processService;

    @PostMapping("addProcess")
    @ApiOperation(value = "新增流程")
    public void addProcess(@RequestBody @Valid ProcessCmd cmd) {
        processService.addProcess(cmd);
    }

    @PostMapping("editProcess")
    @ApiOperation(value = "编辑流程")
    public void editProcess(@RequestBody @Valid ProcessEditCmd cmd) {
        processService.editProcess(cmd);
    }

    @PostMapping("manageProcess")
    @ApiOperation(value = "禁用/启用流程")
    public void manageProcess(@RequestBody @Valid ProcessManageCmd cmd) {
        processService.manageProcess(cmd);
    }

    @GetMapping("getProcessInfo/{processId}")
    @ApiOperation(value = "获取流程信息")
    public ProcessVO getProcessInfo(@PathVariable String processId) {
       return processService.getProcessInfo(processId);
    }

    @GetMapping("getProcessConfigData/{processDataId}")
    @ApiOperation(value = "获取流程配置数据")
    public List<ProcessNodeVO> getProcessConfigData(@PathVariable String processDataId) {
       return processService.getProcessConfigData(processDataId);
    }

    @GetMapping("processList")
    @ApiOperation(value = "获取流程列表")
    public Pagination<ProcessListVO> processList(ProcessListParam param) {
        return processService.processList(param);
    }


    @PostMapping("processConfig")
    @ApiOperation(value = "流程配置 保存或发布")
    public void processConfig(@RequestBody @Valid ProcessConfigCmd cmd) {
        processService.processConfig(cmd);
    }

    @PostMapping("processEnable")
    @ApiOperation(value = "启用或切换流程")
    public void processEnable(@RequestBody @Valid ProcessEnableCmd cmd) {
        processService.processEnable(cmd);
    }

    @PostMapping("updateAndGetStatus")
    @ApiOperation(value = "根据案号先更新再获取鱼骨图流程及节点状态")
    public ProcessStatusVO updateAndGetStatus(@RequestBody @Valid CaseProcessStatusCmd cmd) {
        return processService.updateAndGetStatus(cmd);
    }


    @GetMapping("getDataNodeData")
    @ApiOperation(value = " 根据案件获取鱼骨图数据节点数据（前端传入案号和流程id）")
    public CaseProcessDataNodeDataVO getDataNodeData(CaseProcessDataNodeDataParam param) {
        return processService.getDataNodeData(param);
    }

    @PostMapping("updateAllCaseStatus")
    @ApiOperation(value = "更新所有案件的鱼骨图流程及节点状态")
    public void updateAllCaseStatus() {
        processService.updateAllCaseStatus();
    }

    @PostMapping("updateSingleCaseStatus")
    @ApiOperation(value = "更新单个案件的鱼骨图流程及节点状态")
    public void updateSingleCaseStatus(SingleCaseUpdateCmd cmd) {
        processService.updateSingleCaseStatus(cmd);
    }
    // 接口

    //业务

    //TODO  目前只有一个类型 三个类型  一类：执行 审判 （数据源区分）   二类：财产保全  金钱给付（如何区分）

    //TODO 待修改
    // 子流程需要修改 是否需要标识子流程，根据案件搜索时展示几个流程？  新建流程时不会标记是子流程  目前case对应的几张表 process_id直接用主流程或子流程的

    // 已完成
    // 节点点亮修改：1、系统需具备节点状态管理功能，状态信息具备颜色、状态名称、状态id、层级字段（颜色和层级不可重复）。
    // 2、节点维护状态规则时，右侧展示所有状态，默认全部关闭，手动打开，打开时必须维护规则，规则包含且、或、包含、大于等于小于等运算符，也可以配置常亮。多种状态同时满足时以层级高的作为展示相应状态及颜色的依据。
    // 3.每一个状态配置办理时限规则时，代表上一个状态点亮后此状态在时限内完成（时限>=N 或时限<=N）
    // 表结构和流程数据结构需修改：1.流程数据结构：在原来基础再嵌套一层数组，并增加颜色、状态名称、状态id、层级字段（颜色和层级不可重复）。
    // 2.新增状态表（维护颜色、状态名称、状态id）
    // 3.原有t_case_data_node的节点状态字段去除，新增一张表关联，表中有状态及点亮日期
    // 接口修改：获取流程配置  com.rmfyzxfw.caseprocess.controller.ProcessController#getProcessData
    // 流程配置、发版或修改  com.rmfyzxfw.caseprocess.controller.ProcessController#processConfig
    // case相关表po待更新 t_case_data_node t_case_process_node t_case_process_task  done
    // 添加 dataSourceType 审判或执行  对应接口和表需要加上 po已加 接口入参待加  done
}
